package org.example.campusforum.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.example.campusforum.entity.User;
import org.example.campusforum.mapper.UserMapper;
import org.example.campusforum.service.UserService;
import org.example.campusforum.vo.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;

/**
 * 用户服务实现类
 *
 * 实现用户相关的业务逻辑，包括用户信息查询、更新、密码管理和用户注册等功能。
 * 继承ServiceImpl提供基础的CRUD操作，实现UserService接口。
 *
 * @author CampusForum Team
 * @version 1.0
 * @since 2024
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    /**
     * 用户数据访问层
     */
    @Autowired
    private UserMapper userMapper;
    /**
     * 获取用户信息
     *
     * 根据用户ID查询用户的基本信息，包括昵称、头像、性别、年龄和个性签名。
     * 将实体对象转换为VO对象返回。
     *
     * @param userId 用户ID
     * @return 用户信息VO对象，如果用户不存在则返回null
     */
    @Override
    public UserInfo getUserInfo(Long userId) {
        // 根据用户ID查询用户信息
        User user = this.getById(userId);
        if (user == null) {
            return null;
        }

        // 使用Builder模式转换为UserInfo对象
        return UserInfo.builder()
                .nickname(user.getNickname())
                .avatar(user.getAvatar())
                .sex(user.getSex())
                .age(user.getAge())
                .signature(user.getSignature())
                .build();
    }

    /**
     * 修改密码
     *
     * 验证用户的原密码后更新为新密码。
     * 需要提供正确的原密码才能修改成功。
     * 使用事务确保数据一致性。
     *
     * @param email 用户邮箱
     * @param oldPassword 原密码
     * @param newPassword 新密码
     * @return 是否修改成功
     */
    @Transactional
    public boolean changePassword(String email, String oldPassword, String newPassword) {
        // 验证原密码
        String storedPassword = userMapper.getPasswordByEmail(email);
        if (storedPassword == null || !storedPassword.equals(oldPassword)) {
            return false;
        }

        // 更新密码
        int affectedRows = userMapper.updatePassword(email, newPassword);
        return affectedRows > 0;
    }

    /**
     * 重置密码（忘记密码）
     *
     * 通过邮箱验证后直接重置用户密码，无需验证原密码。
     * 通常用于忘记密码的场景。
     *
     * @param email 用户邮箱
     * @param newPassword 新密码
     * @return 是否重置成功
     */
    public boolean resetForgottenPassword(String email, String newPassword) {
        int affectedRows = userMapper.updatePassword(email, newPassword);
        return affectedRows > 0;
    }

    /**
     * 用户注册
     *
     * 创建新用户账户，将用户信息保存到数据库。
     *
     * @param user 用户信息
     * @return 是否注册成功
     */
    @Override
    public boolean registerUser(User user) {
        return userMapper.insert(user) > 0;
    }

    /**
     * 更新用户信息
     *
     * 根据用户ID更新用户的基本信息，只更新非空字段。
     * 自动设置更新时间为当前时间。
     *
     * @param userId 用户ID
     * @param userUpdate 用户更新信息，包含要更新的字段
     * @return 是否更新成功
     */
    @Override
    public boolean updateUserInfo(Long userId, User userUpdate) {
        // 根据用户ID查询用户
        User user = this.getById(userId);
        if (user == null) {
            return false;
        }

        // 只更新非空字段
        if (userUpdate.getNickname() != null) {
            user.setNickname(userUpdate.getNickname());
        }
        if (userUpdate.getAvatar() != null) {
            user.setAvatar(userUpdate.getAvatar());
        }
        if (userUpdate.getSex() != null) {
            user.setSex(userUpdate.getSex());
        }
        if (userUpdate.getAge() != null) {
            user.setAge(userUpdate.getAge());
        }
        if (userUpdate.getSignature() != null) {
            user.setSignature(userUpdate.getSignature());
        }

        // 设置更新时间
        user.setUpdateTime(LocalDateTime.now());

        // 保存更新
        return this.updateById(user);
    }
}